# -*-coding:utf-8-*-

import pymongo
from bson.objectid import ObjectId
from daos.base import BaseDao


class RoomsDao(BaseDao):
    def __init__(self, db):
        super(RoomsDao, self).__init__(db, 'rooms')

    def get_room_list_by_phone_of_owner(self, phone):
        result = []
        # 先把相关的 area 过滤出来
        for a in self.collection.find({'partitions.rooms.phone': phone}):
            ps = a['partitions']
            sel_flag = False
            # 打描 area 中所有 building 分区
            for p in ps:
                rooms = []
                if p['type'] != 'building':
                    continue
                rs = p['rooms']
                for r in rs:
                    if r['phone'] == phone:
                        if r.has_key('password'):
                            del r['password']
                        rooms.append(r)
                # 更新 partition.rooms 字段，目的是将不相关的 rooms 信息去掉
                if 0 < len(rooms):
                    sel_flag = True
                    p['rooms'] = rooms
            if sel_flag:
                a['_id'] = str(a['_id'])
                del a['users']
                del a['admin']
                result.append(a)
        return result


areas = [
    {
        'admin': '596585d5559c5856ea82fd7a',
        'users': [],
        'name': '华发四季',
        'partitions': [  # NOTE: 数量需要限制
            {
                'type': 'building',
                'name': '6栋一单元',
                'number': 6,
                'entrances': [  # 每个 entrance 有各种设备？目前就一种, ACM
                    {
                        'name': '大堂入口',
                        'device_id': 'DEVICE_ID_0',
                    },
                    {
                        'name': '车库入口',
                        'device_id': 'DEVICE_ID_1',
                    },
                ],
                'rooms': [  # NOTE: 数量需要限制
                    {
                        'rid': str(ObjectId()),
                        'number': 2801,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000000',
                        'password': 'PASSWORD',  # 设置了 password 才具备远程开门等权限
                    },
                    {
                        'rid': str(ObjectId()),
                        'number': 2802,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000000',
                    },
                ]
            },
            {
                'type': 'building',
                'name': '8栋一单元',
                'number': 8,
                'entrances': [  # 每个 entrance 有各种设备？目前就一种, ACM
                    {
                        'name': '大堂入口',
                        'device_id': 'DEVICE_ID_4',
                    },
                    {
                        'name': '车库入口',
                        'device_id': 'DEVICE_ID_5',
                    },
                ],
                'rooms': [  # NOTE: 数量需要限制
                    {
                        'rid': str(ObjectId()),
                        'number': 801,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000000',
                    },
                    {
                        'rid': str(ObjectId()),
                        'number': 202,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000001',
                    },
                ]
            },
            {
                'type': 'entrance',  # 公有的入口
                'name': '南门入口',
                'entrances': [
                    {
                        'name': '南门入口',
                        'device_id': 'DEVICE_ID_2',  # pub DEVICE_ID_2:6:2801
                    }
                ],
            }
        ]
    },
    {
        'admin': '596585d5559c5856ea82fd7a',
        'users': [],
        'name': '华发四季2',
        'partitions': [  # NOTE: 数量需要限制
            {
                'type': 'building',
                'name': '1栋一单元',
                'number': 1,
                'entrances': [  # 每个 entrance 有各种设备？目前就一种, ACM
                    {
                        'name': '大堂入口',
                        'device_id': 'DEVICE_ID_3',
                    },
                    {
                        'name': '车库入口',
                        'device_id': 'DEVICE_ID_4',
                    },
                ],
                'rooms': [  # NOTE: 数量需要限制
                    {
                        'rid': str(ObjectId()),
                        'number': 3801,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000000',
                    },
                    {
                        'rid': str(ObjectId()),
                        'number': 1802,  # 需要确保在 rooms 数组中唯一
                        'phone': '13400000001',
                    },
                ]
            },
            {
                'type': 'entrance',  # 公有的入口
                'name': '北门入口',
                'entrances': [
                    {
                        'name': '北门入口',
                        'device_id': 'DEVICE_ID_5',  # pub DEVICE_ID_2:6:2801
                    }
                ],
            }
        ]
    },
]


# print result

# result = []
# import time
# s = time.time()
# for a in c.aggregate([{'$unwind': '$partitions'},
#                       {'$unwind': '$partitions.rooms'},
#                       {'$match': {'partitions.rooms.phone': '13400000000'}},
#                       {'$group': {'_id': '$partitions.pid', 'rooms': {'$push': '$partitions.rooms'},
#                                   'root': {'$first': '$$ROOT'}}},
#                       ]):
#     print a
#
# print time.time() - s

def test():
    import json
    import time

    db = pymongo.MongoClient().test_db
    c = db.get_collection('areas')
    c.drop()
    c.insert_many(areas)

    s = time.time()
    phone = '13400000000'
    result = RoomsDao(db).get_room_list_by_phone_of_owner(phone)
    print json.dumps(result, indent=4)
    print time.time() - s

    for a in c.find({'admin': '596585d5559c5856ea82fd7a', '_id': areas[0]['_id']}):
        print a


if '__main__' == __name__:
    test()
